package com.qf.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Aspect: 配置切面类
 * @Component: 创建切面类对象，存入到容器中
 *
 * 切面 = 切入点 + 增强
 * @version v1.0.0
 * @Description:
 * @author: 姜红凯
 * @date: 2022.02.10
 * @since 1.0
 */

@Aspect
@Component
public class AspectDemo {

    //定义切入点表达式
    @Pointcut("execution(* com.qf.service..*.*(..))")
    public void pc(){

    }
//
//    @Before("pc()")
//    public void  before(){
//        System.out.println("在方法之前执行");
//
//    }
//
//    @AfterReturning("pc()")
//    public void afterReturning(){
//        System.out.println("在方法之后执行,如果有异常，则不执行");
//    }
//
//    @After("pc()")
//    public void after(){
//        System.out.println("在方法之后执行，无论是否有异常都会执行");
//    }
//
//    @AfterThrowing("pc()")
//    public void afterThrowing(){
//        System.out.println("有异常会执行此方法");
//    }

    @Around("pc()")
    public  Object around(ProceedingJoinPoint joinPoint) {

        try {
            System.out.println("前置");
            //调用原始方法, 返回值是原始方法的返回值， 如果是void，返回null
            Object result = joinPoint.proceed();
            System.out.println("后置，如果有异常，则不执行");
            return result;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常增强");
        } finally {
            System.out.println("后置，有没有异常，都会执行");
        }
        return null;
    }
}
